import { Injectable } from '@nestjs/common';
import { InjectRedis } from '@nestjs-modules/ioredis';
import Redis from 'ioredis';
import { isNumericString, isType } from '@/common/utils/judge';

@Injectable()
export class IoredisService {
  constructor(@InjectRedis() private readonly redis: Redis) {}

  /**
   * redis get
   * @param {string} key 键
   * @returns 值
   */
  async get(key: string) {
    let value = await this.redis.get(key);

    if (value === null || isNumericString(value)) return value;

    try {
      // 如果是有效的 JSON 字符串，则解析它
      return JSON.parse(value);
    } catch (error) {
      // 如果不是有效的 JSON 字符串，则返回原始字符串
      return value;
    }
  }

  /**
   * redis set
   * @param {string} key 键
   * @param {any} value 值
   * @param {number} ttl 过期时间 默认秒
   * @param {boolean} isMs 是否以毫秒为单位，默认false
   * @returns
   */
  async set(key: string, value: any, ttl?: number, isMs: boolean = false) {
    // 序列化
    const serializedValue = typeof value == 'object' ? JSON.stringify(value) : value;

    if (ttl) {
      if (isMs) {
        // 以毫秒为单位
        return this.redis.psetex(key, ttl, serializedValue);
      } else {
        // 以秒为单位
        return this.redis.setex(key, ttl, serializedValue);
      }
    } else {
      // 如果没有提供 ttl，则只调用 set
      return this.redis.set(key, serializedValue);
    }
  }

  /**
   * redis del
   * @param {string} key 单个键删除
   * @returns
   */
  async del(key: string) {
    return this.redis.del(key);
  }

  /**
   * redis dels
   * @param {string[]} keys 多个键删除
   * @returns
   */
  async dels(keys: string[]) {
    // 过滤无效值
    const delKeys = keys.filter((item) => item);
    return this.redis.del(delKeys);
  }
}
